'use strict'

let _ = require('lodash');


let getCheck = {
    checkEmail: function(val) {
        var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        if (filter.test(val)) {
            return true;
        } else {
            return false;
        }
    },
    checkPhone: function(val) {
        var filter = /^1\d{10}$/;

        if (filter.test(val)) {
            return true;
        } else {
            return false;
        }
    },
    checkNickName: function(nickName){
        return /^[\u4E00-\u9FA5a-zA-Z0-9_-]{2,20}$/.test(nickName); 
    },
    checkPassword:function(val){
        var lv = 0;
        if(val.match(/[a-z]/g)) lv++;
        if(val.match(/[A-Z]/g)) lv++;
        if(val.match(/[0-9]/g)) lv++;
        if(val.match(/(.[^A-Za-z0-9])/g)) lv++;
        if(val.length < 6 || val.length>20) lv=0;
        if(lv > 3) lv=3;
        return lv > 1; 
    }


}

/**
 * 从文本中提取出@username 标记的用户名数组
 * @param {String} text 文本内容
 * @return {Array} 用户名数组
 */
const fetchUsers = function(text) {
    if (!text) {
        return [];
    }

    var ignoreRegexs = [
        /```.+?```/g, // 去除单行的 ```
        /^```[\s\S]+?^```/gm, // ``` 里面的是 pre 标签内容
        /`[\s\S]+?`/g, // 同一行中，`some code` 中内容也不该被解析
        /^    .*/gm, // 4个空格也是 pre 标签，在这里 . 不会匹配换行
        /\b\S*?@[^\s]*?\..+?\b/g, // somebody@gmail.com 会被去除
        /\[@.+?\]\(\/.+?\)/g, // 已经被 link 的 username
    ];

    ignoreRegexs.forEach(function(ignore_regex) {
        text = text.replace(ignore_regex, '');
    });

    var results = text.match(/@[a-z0-9\-_]+\b/igm);
    var names = [];
    if (results) {
        for (var i = 0, l = results.length; i < l; i++) {
            var s = results[i];
            //remove leading char @
            s = s.slice(1);
            names.push(s);
        }
    }
    names = _.uniq(names);
    return names;
};

/**
 * 根据文本内容，替换为数据库中的数据
 * @param {String} text 文本内容
 * @param {Function} callback 回调函数
 */
const linkUsers = function(text) {
    var users = fetchUsers(text);
    for (var i = 0, l = users.length; i < l; i++) {
        var name = users[i];
        text = text.replace(new RegExp('@' + name + '\\b(?!\\])', 'g'), '[@' + name + '](/user/' + name + ')');
    }
    return text;
};


/**
 *   对Date的扩展，将 Date 转化为指定格式的String 
 *   月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符， 
 *   年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 *   例子：
 *   (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
 *   (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18 
 */
const fmtDate = function(date, fmt) { //author: meizz 
    var o = {
        "M+": date.getMonth() + 1, //月份 
        "d+": date.getDate(), //日 
        "h+": date.getHours(), //小时 
        "m+": date.getMinutes(), //分 
        "s+": date.getSeconds(), //秒 
        "q+": Math.floor((date.getMonth() + 3) / 3), //季度 
        "S": date.getMilliseconds() //毫秒 
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}


/**
 * 由于moment库加进来太大了，自定义了formnow函数，待完善阶段
 */
const MillisecondToDate = function(msd) {
    var time = parseFloat(msd) / 1000;
    var str ="";
    if (null != time && "" != time) {

        if (time > 60 && time < 3600) {
            str = parseInt(time / 60.0) + " 分钟前";
        }
        else if (time >= 3600 && time < 86400) {
            str = parseInt(time / 3600.0) + " 小时前" ;
        }
        else if (time >= 86400 && time < 86400*30) {
            str = parseInt(time / 86400.0) + " 天前" ;
        }
        else if (time >= 86400*30 && time < 86400*365) {
            str = parseInt(time / (86400.0*30)) + " 个月前" ;
        } 
        else if(time >= 86400*365){
            str = parseInt(time / (86400.0*365)) + " 年前" ;
        }
        else {
            str = parseInt(time) + " 秒前";
        }
    }
    return str;
}
/**
 * 常见错误码
 */
const ERROR_DEFINE = new Object();
    ERROR_DEFINE[400] = "未知错误";
    ERROR_DEFINE[401] = "服务端错误";
    ERROR_DEFINE[402] = "网络通讯错误";
    ERROR_DEFINE[403] = "JSON解析错误";
    ERROR_DEFINE[501] = "数据库发生错误";
    ERROR_DEFINE[404] = "验证码错误";
    ERROR_DEFINE[405] = "Email地址不存在";
    ERROR_DEFINE[406] = "手机号码不存在";
    ERROR_DEFINE[407] = "密码错误";
    ERROR_DEFINE[408] = "登录电话号码或者Email错误";
    ERROR_DEFINE[409] = "登录失效";
    ERROR_DEFINE[410] = "用户没有激活";
    ERROR_DEFINE[411] = "用户已锁定,请联系客服人员";
    ERROR_DEFINE[412] = "用户权限限制,不能做此操作";
    ERROR_DEFINE[413] = "电话号码已被注册";
    ERROR_DEFINE[414] = "Email地址已被注册";
    ERROR_DEFINE[415] = "金融产品不存在";
    ERROR_DEFINE[416] = "用户不存在";
    ERROR_DEFINE[417] = "投顾团队不存在";
    ERROR_DEFINE[418] = "密码加密错误";
    ERROR_DEFINE[419] = "银行账户已存在";
    ERROR_DEFINE[420] = "账户没有足够余额";
    ERROR_DEFINE[421] = "非法操作,没有权限";
    ERROR_DEFINE[422] = "上载文件错误";
    ERROR_DEFINE[423] = "全文检索Sphnix错误";
    ERROR_DEFINE[424] = "没有操作权限";
    ERROR_DEFINE[425] = "留言信息不存在";
    ERROR_DEFINE[426] = "没有购买产品信息";
    ERROR_DEFINE[427] = "有敏感词汇,不能评论";
    ERROR_DEFINE[428] = "发表评论太频繁";
    ERROR_DEFINE[429] = "必填字段错误";
    ERROR_DEFINE[430] = "用户组已被使用，不能删除";
    ERROR_DEFINE[431] = "功能已被使用，不能删除";
    ERROR_DEFINE[432] = "实名次数超出限制";
    ERROR_DEFINE[433] = "姓名和身份证不能为空";
    ERROR_DEFINE[444] = "身份证格式错误";
    ERROR_DEFINE[445] = "姓名格式错误:2-5个中文字符";
    ERROR_DEFINE[446] = "请求连接中断";
    ERROR_DEFINE[447] = "实名签名错误";
    ERROR_DEFINE[448] = "TLT接口查询失败或未查到数据";
    ERROR_DEFINE[449] = "已经实名,勿重复实名";
    ERROR_DEFINE[450] = "数据的数字签名错误";
    ERROR_DEFINE[451] = "回调返回数据错误";
    ERROR_DEFINE[452] = "回调数据中交易时间不合法";
    ERROR_DEFINE[453] = "订单不存在";
    ERROR_DEFINE[454] = "银行卡格式错误";
    ERROR_DEFINE[455] = "银行卡认证上限";
    ERROR_DEFINE[456] = "已经绑定了银行卡";
    ERROR_DEFINE[457] = "产品订单不存在";
    ERROR_DEFINE[458] = "付款金额不对";
    ERROR_DEFINE[459] = "银行卡未绑定";
    ERROR_DEFINE[463] = "用户权限限制,不能做此操作";
    ERROR_DEFINE[464] = "登录失效";
    ERROR_DEFINE[469] = "短信动态码错误";
    ERROR_DEFINE[473] = "身份证号码错误";
    ERROR_DEFINE[474] = "密保答案错误";
    ERROR_DEFINE[479] = "用户已存在";
    ERROR_DEFINE[480] = "密保问题未绑定";
    ERROR_DEFINE[481] = "超出可以赎回的份额";
    ERROR_DEFINE[482] = "读取excel文件错误";
    ERROR_DEFINE[483] = "MOM报名参加比赛资料未提交";
    ERROR_DEFINE[484] = "预约咨询太频繁了";
    ERROR_DEFINE[485] = "团队未审核";
    ERROR_DEFINE[486] = "组织机构代码错误";
    ERROR_DEFINE[487] = "产品未创建完成";

const QUESTIONS = {
    1: '您就读的第一所学校全称叫什么？',
    2: '您就职的第一家公司叫什么名字？',
    3: '您印象最深的班主任叫什么名字？',
    4: '您的第一只宠物叫什么名字？',
    5: '您的长子或长女的昵称叫什么？',
    6: '您的父亲叫什么名字？',
    7: '您的母亲叫什么名字？',
    8: '您的配偶叫什么名字？',
    9: '您儿时最好的玩伴叫什么名字？',
    10: '您上学期间最好的室友的名字是？'
};

exports.linkUsers = linkUsers;
exports.fetchUsers = fetchUsers;
exports.getCheck = getCheck;
exports.fmtDate = fmtDate;
exports.MillisecondToDate = MillisecondToDate;
exports.ERROR_DEFINE = ERROR_DEFINE;
exports.QUESTIONS = QUESTIONS;